#include "MapaParser.h"

MapaParser::MapaParser(Mapa* unMapa) : xmlpp::SaxParser()
{
	mapaDelJuego = unMapa;
}

void MapaParser::on_start_element(const Glib::ustring& name,
                                const AttributeList& properties){
	  if(name.compare("continente") == 0){
	  		cargaContinente(properties);
	  }
	  else if(name.compare("pais") == 0){
	  		cargaPais(properties);
	  	}
	  else if(name.compare("conexion") == 0){
	  		cargaConeccion(properties);
	  }
}

void MapaParser::cargaContinente(const AttributeList& properties){
	int bonusPorContinente = 0;
	for(xmlpp::SaxParser::AttributeList::const_iterator iter = properties.begin(); iter != properties.end(); ++iter){
		if(iter->name.compare("nombre") == 0)
			this->continente = iter->value;
		else if(iter->name.compare("bonus") == 0)
			bonusPorContinente = atoi(iter->value.data());
	}
	if (mapaDelJuego->obtenerContinente(this->pais) == NULL)
		mapaDelJuego->agregarContinente(this->continente,bonusPorContinente);
	else
		mapaDelJuego->obtenerContinente(this->continente)->setBonus(bonusPorContinente);
}

void MapaParser::cargaPais(const AttributeList& properties){
	for(xmlpp::SaxParser::AttributeList::const_iterator iter = properties.begin(); iter != properties.end(); ++iter)
		if(iter->name.compare("nombre") == 0) {
			this->pais = iter->value;
			if (mapaDelJuego->obtenerTerritorio(this->pais) == NULL)
				mapaDelJuego->agregarTerritorio(this->pais,this->continente);
		}
	
}

void MapaParser::cargaConeccion(const AttributeList& properties){
	
	string nPais, nContinente;
	
	for(xmlpp::SaxParser::AttributeList::const_iterator iter = properties.begin(); iter != properties.end(); ++iter){
		if(iter->name.compare("nombre") == 0)
			nPais = iter->value;
		else if(iter->name.compare("continente") == 0)
			nContinente.assign(iter->value);
	}
	
	Territorio* aux = mapaDelJuego->obtenerTerritorio(pais);
	
	if (mapaDelJuego->obtenerTerritorio(nPais) == NULL) {
		if (mapaDelJuego->obtenerContinente(nContinente) == NULL)
			mapaDelJuego->agregarContinente(nContinente);
		mapaDelJuego->agregarTerritorio(nPais,nContinente);
	}
	aux->agregarAdyacencia(mapaDelJuego->obtenerTerritorio(nPais));
}

Mapa* MapaParser::obtenerMapa() {
	return mapaDelJuego;
}

MapaParser::~MapaParser()
{
}

